/**
*!!很重要的经验，如果这个里面有比较复杂的图形，则最好是cacheAsBitmap，否则cpu占用会很高，而且要不需要显示的动画关闭掉
*如果不catchAsBitmap,100个mc能占50%的cpu!! 
*
*注意一个很重要的问题是md里的东西的变化导致整个group重新排序，这是很耗费运算量的
*解决方案是：针对spreit,我能知道他的位置，旋转，缩放是哪个是脏的。只有位置变化和摄像机变化才会对外通报说我变化了
*
*注意这个的scael和rotation会始终刷新的，
*但是只有当位置变化或者摄像机变化或者forceRefresh的时候才通知外部自己变了才去重新排序
*
*RPG游戏中的3D场景2d小人，人始终朝着摄像机方向
*/
package kgame5.k3d.util3d {
import kgame5.k3d.core.obj3d.node3d.Node3D;

public class Sprite3DHeavy extends Node3D{
//	//_____________Static_______________
//	
//	public static const DIR_NUM:int=4;//4个方向共有
//	
//	//z正方向 朝上,x正方向向左,上北下南左西右东
//	public static const 
//		DIR_E:int=1,//东
//		DIR_W:int=2,//西
//		DIR_S:int=3,//南
//		DIR_N:int=4;//北
//	
//	//1,2,3,4是为了让visu的mc定位gotoAndStop(1)等等
//	static const 
//		SCREENDIR_BACK:int=1,
//		SCREENDIR_FACE:int=2,
//		SCREENDIR_LEFT:int=3,
//		SCREENDIR_RIGHT:Number=4;
//	//[camerDir][dir]可以得出screenDir
//	static const SCREENDIR:Array=[
//		[SCREENDIR_FACE,SCREENDIR_BACK,SCREENDIR_LEFT,SCREENDIR_RIGHT],//摄象机在人东面
//		[SCREENDIR_BACK,SCREENDIR_FACE,SCREENDIR_RIGHT,SCREENDIR_LEFT],//摄象机在人西面
//		[SCREENDIR_RIGHT,SCREENDIR_LEFT,SCREENDIR_FACE,SCREENDIR_BACK],//摄象机在人南面
//		[SCREENDIR_LEFT,SCREENDIR_RIGHT,SCREENDIR_BACK,SCREENDIR_FACE]//摄象机在人北面
//	];
//	
//	
//	//________________________Property____________________________
//	
//	//朝向
//	private var _dir:int=1;//RPG游戏中使用的4方向,上，下，左，右
//	
//	//姿势
//	private var _action:int=1;//姿势，姿势与_dir组合得出人物的_actionIdx（就是实际的动作索引）
//	
//	//
//	private var bAdjustDir:Boolean=true;// 如果是Sprite3D,是否根据摄象机在人的不同位置而显示人的不同方向
//	
//	//根据摄象机调整位置
//	private var bForceStart:Boolean=false;
//	private var pre_cameraDir:int=-1;
//	
//	//
//	private var v3d_md2camera:Vector3D;//人与摄象机的连线
//	
//	//因为排序是要100个要消耗10ms的!!很昂贵的！！,所以一定要在这里做优化
//	private var Moc_pre:Matrix3D;
//	
//	//__________________________Method____________________________
//	public function Sprite3DHeavy(p_visu:Visu,p_sortable:Boolean=true){
//		//--
//		super(p_visu,p_sortable);
//
//		//--人与摄象机连线
//		v3d_md2camera=new Vector3D(0,0,0);
//		
//		//--优化相关的 
//		Moc_pre=new Matrix3D();
//	}
//	
//	//Sprite3D,是否根据摄象机在人的不同位置而显示人的不同方向
//	 public function setAdjustDir(p_AdjustDir:Boolean):void{
//		bAdjustDir;
//	}
//	//Sprite3D,小人动画是否从头开始
//	 public function setForceStart(p_bForceStart:Boolean):void{
//		bForceStart=p_bForceStart;
//	}
//
//	//这个要返回值的原因是当位置旋转缩放都不变的时候,就不排序,因为排序是要消耗很大运算的cpu的，数目越多排序越慢
//	//返回的是否改变了 自己的 位置，旋转，缩放,这些是需要重新排序的,改变了返回true,不改变是false
//	//改变位置，旋转，缩放都回导致重新排深度的,
//	override public function Update(rsd:RenderSessionData):void{
//		//T.p("Sprite3D.Update "+this.isVisible());
//		
//		//--
//		if(isVisible()==false){
//				
//			//!!重要的机制
//			//在这里最终设置是否显示，很重要的设置，保证每次
//			//md.setVisible之后都是在计算出新的位置之后才显示的，否则会显示错误的位置！
//			//visu.getDisplayObject().visible=false;
//			
//			visu.hide();
//			
//			return ;//就当是位置，旋转，缩放都没变,
//		}
//		
//		
//		//--计算Sprite3D的真
//		
////		if(bAdjustDir){//需要4方向小人根据摄象机调整自己的方向
////			var cameraDir:Number=calcCameraDir(world.getCameraBee().v3d_eye);
////			if(cameraDir!=pre_cameraDir){
////				pre_cameraDir=cameraDir; 
////			}
////			//_root.tf_cd.text=cameraDir;
////			var screenDir:Number=calcScreenDir(cameraDir,_dir);
////			//_root.tf_sd.text=screenDir;
////			var actionIdx:Number=CalcActionIdx(_action,screenDir);
////			//_root.tf_ai.text=actionIdx;
////			visu.ChangePose(actionIdx,bForceStart);
////			
////			bForceStart=false;//不强制从头开始,当不是由摄象机产生的变化的时候才强制从头做动画
////		}
//		
//		//--
//		calcMoc_Sprite3D(rsd.Mwc);//这个运算量还不是很高，只是matrix相乘，依次就可以了，不是matrix*很多个vertex
//		
//		//--!!重要的机制
//		//在这里最终设置是否显示，很重要的设置，保证每次
//		//md.setVisible之后都是在计算出新的位置之后才显示的，否则会显示错误的位置！
//		visu.show();
//		
//		//设置缩放,!!这个是Sprite3D的特殊用法
//		visu.setSprite3DScale(hardVO.v3d_s.x,hardVO.v3d_s.y);
//		//旋转,!!这个是特殊的，需要做到visu.mc里
//		visu.setSprite3DRotation(hardVO.v3d_r.y);
//		
//		//刷新
//		visu.render(Moc, rsd);
//		
//		
//		
//		
//			
//		
//		
//		
//		
//		
//	}
//	
//	 public function getDir():int{
//		return _dir;
//	}
//	 public function getAction():int{
//		return _action;
//	}
//	
//	//逻辑需要用到的
//	 public function Eoa():Boolean{
//		return visu.Eoa();
//	}
//	
//	 public function ChangeAction(p_action:int):void{
//		_action=p_action;
//		bForceStart=false;
//		
//		//var screenDir:Number=calcScreenDir(Sprite3D.DIR_S,_dir);
//		//var actionIdx:Number=CalcActionIdx(_action,screenDir);
//		
//		var actionIdx:int=CalcActionIdx(_action,_dir);
//		visu.ChangePose(actionIdx,bForceStart);
//		
//	}
//	 public function ChangeDir(p_dir:int):void{
//		_dir=p_dir;
//		bForceStart=false;
//		
//		//var screenDir:Number=calcScreenDir(Sprite3D.DIR_S,_dir);
//		//var actionIdx:Number=CalcActionIdx(_action,screenDir);
//		var actionIdx:int=CalcActionIdx(_action,_dir);
//		visu.ChangePose(actionIdx,bForceStart);
//	}
//	
//	
//	//由_action 和_dir得到actionIdx(实际的动作索引)
//	private function CalcActionIdx(p_action:int,p_ScreenDir:int):int{
//		var actionIdx:int=(p_action-1)*Sprite3DHeavy.DIR_NUM+p_ScreenDir;
//		return actionIdx;
//	}
//	
//	//计算摄象机在人的什么方向,v3d_cameraP是摄象机的位置
//	private function calcCameraDir(v3d_cameraP:Vector3D):int{
//		Vector3D.SSub(v3d_cameraP,hardVO.v3d_p,v3d_md2camera);
//		var Z:Number=Math.abs(v3d_md2camera.z);
//		var X:Number=Math.abs(v3d_md2camera.x);
//		if(X<Z){
//			if(v3d_md2camera.z<0){
//				return Sprite3DHeavy.DIR_S;
//			}else{
//				return Sprite3DHeavy.DIR_N;
//			}
//		}else if(X>=Z){
//			if(v3d_md2camera.x<0){
//				return Sprite3DHeavy.DIR_W;
//			}else{
//				return Sprite3DHeavy.DIR_E;
//			}
//		}
//		return 0;
//	}
//	
//	//根据_dir(真实世界里的方向)和camreDir(摄象机与人连线的方向)计算出人应该以哪个方向显示在屏幕上
//	//
//	private function calcScreenDir(p_cameraDir:int,p_dir:int):int{
//		return SCREENDIR[p_cameraDir][p_dir];
//	}
	
}//end of class
}

//////////////////////////
////=============Sprite3D要实现的
//	
//	public function getDir():int{return -1;}
//	public function getAction():int{return -1;}
//	
//	//是否根据摄象机在人的不同位置而显示人的不同方向
//	public function setAdjustDir(p_AdjustDir:Boolean):void{}
//	//小人动画是否从头开始
//	public function setForceStart(p_bForceStart:Boolean):void{}
//	//判断动作是否做完
//	public function Eoa():Boolean{return false;}
//	
//	public function ChangeAction(p_action:int):void{}
//	public function ChangeDir(p_dir:int):void{}
//	
//	//由_action 和_dir得到actionIdx(实际的动作索引)
//	public static function CalcActionIdx(p_action:int,p_ScreenDir:int):int{return -1;}
//	